home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_DM / DM_154 / DM_154.MSA / TRK_CONV.LST < prev    next >
File List  |  1986-02-06  |  5KB  |  169 lines

  1. '                     ------- Tracker  Converter -------               v1.0
  2. '                     geschrieben von Fugu & Chris  4/90
  3. ' -----------------------------------------------------------------------------
  4. '
  5. ' 4 Bytes für einen Eintrag = 2 Bytes Notenwert + 2 Bytes Attribut
  6. '
  7. ' Songname: Bytes 1-20
  8. ' Anfang der Sampleliste: ab Byte 21 (450 Bytes)
  9. '       je 30 Bytes: 22 Name + 2 Länge? + 2 Volume + 4 Loop
  10. ' Länge der Patternliste: Byte 471
  11. ' Patternliste: ab Byte 473 (120 Bytes)
  12. ' Byte 593-600: 00
  13. ' Patterns: ab Byte 601 (je 1024 Bytes)
  14. ' -----------------------------------------------------------------------------
  15. '
  16. ' 2 Bytes für einen Eintrag = 1 Byte Notenwert + 1 Byte Attribut
  17. '
  18. ' "AN COOL!": Byte 1-8
  19. ' Byte 9-11: 00
  20. ' Anzahl Patterns: Byte 12
  21. ' Speed: Byte 13
  22. ' Byte 14: 00
  23. ' Patternliste: ab Byte 15 (128 Bytes)
  24. ' Länge der Patternliste: Byte 143
  25. ' Byte 144: 00
  26. ' Sampleliste: ab Byte 145 (128 Bytes)
  27. ' Patterns: ab Byte 273 (je 512 Bytes)
  28. '
  29. DEFLIST 0
  30. maxlen=200000
  31. DIM smp%(maxlen/4)
  32. s_offs=LPEEK(ARRPTR(smp%()))+4
  33. d_offs=s_offs+100000
  34. DIM voice%(3),oldvoice%(3)
  35. DIM t%(36)
  36. @tab_init
  37. '
  38. REPEAT
  39.   CLS
  40.   PRINT AT(10,2);CHR$(27);"p Tracker Converter V1.0 ";CHR$(27);"q"
  41.   PRINT AT(24,4);"by fugu & chris"
  42.   PRINT AT(1,8);"<1>  Amiga Soundtracker --> TCB Tracker"
  43.   PRINT AT(1,10);"<2>  TCB Tracker --> Amiga Soundtracker"
  44.   PRINT AT(1,12);"<CR>   Quit"
  45.   REPEAT
  46.     PRINT AT(10,20);SPC(30)
  47.     PRINT AT(10,20);
  48.     INPUT "--> your choice: ",w$
  49.   UNTIL (w$="1") OR (w$="2") OR (w$="")
  50.   PRINT CHR$(7);
  51.   IF w$="1"
  52.     @am_to_st
  53.   ELSE
  54.     IF w$="2"
  55.       @st_to_am
  56.     ENDIF
  57.   ENDIF
  58. UNTIL w$=""
  59. EDIT
  60. '
  61. PROCEDURE am_to_st
  62.   FILESELECT "\*.ami","",n$
  63.   IF n$<>""
  64.     BLOAD n$,s_offs
  65.     PRINT AT(10,23);"File: ";n$
  66.     ' ---> Header erstellen
  67.     maxpat=0
  68.     FOR i=0 TO 127                   !Anz. Patterns ermitteln
  69.       IF maxpat<PEEK(s_offs+472+i)
  70.         maxpat=PEEK(s_offs+472+i)
  71.       ENDIF
  72.     NEXT i
  73.     INC maxpat
  74.     a$="AN COOL!"+STRING$(3,CHR$(0))+CHR$(maxpat)+CHR$(5)+CHR$(0)
  75.     BMOVE VARPTR(a$),d_offs,14        ! eintragen...
  76.     BMOVE s_offs+472,d_offs+14,128    ! Patternliste
  77.     POKE d_offs+142,PEEK(s_offs+470)  ! Länge der Patternliste
  78.     s$=SPACE$(8)
  79.     FOR i=0 TO 14
  80.       BMOVE s_offs+20+6+30*i,VARPTR(s$),8   ! Sampleliste
  81.       s$=UPPER$(s$)
  82.       BMOVE VARPTR(s$),d_offs+144+8*(i+1),8
  83.     NEXT i
  84.     ' ---> Patterns
  85.     ARRAYFILL oldvoice%(),0
  86.     FOR i=0 TO maxpat-1
  87.       PRINT AT(5,16);"...only ";maxpat-i;" patterns to go..."
  88.       FOR z=0 TO 63
  89.         FOR s=0 TO 3
  90.           adr=s_offs+600+1024*i+16*z+4*s
  91.           s_note=DPEEK(adr)
  92.           voice%(s)=PEEK(adr+2) AND 240
  93.           IF voice%(s)=0
  94.             voice%(s)=oldvoice%(s)
  95.           ENDIF
  96.           oldvoice%(s)=voice%(s)
  97.           pos=-1
  98.           FOR j=0 TO 35
  99.             IF ABS(t%(j)-s_note)<2
  100.               pos=j
  101.             ENDIF
  102.           NEXT j
  103.           IF pos>=0
  104.             d_note=16*((pos DIV 12)+1)+pos MOD 12
  105.             adr=d_offs+272+512*i+8*z+2*s
  106.             POKE adr,d_note
  107.             POKE adr+1,voice%(s)
  108.           ENDIF
  109.         NEXT s
  110.       NEXT z
  111.     NEXT i
  112.     l=272+512*maxpat
  113.     FILESELECT "\*.sng","",n$
  114.     IF n$<>""
  115.       BSAVE n$,d_offs,l
  116.     ENDIF
  117.   ENDIF
  118. RETURN
  119. '
  120. PROCEDURE st_to_am
  121.   FILESELECT "\*.sng","",n$
  122.   IF n$<>""
  123.     BLOAD n$,s_offs
  124.     PRINT AT(10,23);"File: ";n$
  125.     ' ---> Header erstellen
  126.     s$="TESTNAME"
  127.     BMOVE VARPTR(s$),d_offs,8         ! Songname
  128.     maxpat=PEEK(s_offs+11)            ! Anz. Patterns
  129.     POKE d_offs+470,PEEK(s_offs+142)  ! Länge Patternliste
  130.     BMOVE s_offs+14,d_offs+472,120    ! Patternliste
  131.     FOR i=0 TO 14
  132.       BMOVE s_offs+144+8+8*i,d_offs+20+30*i,8   ! Sampleliste
  133.     NEXT i
  134.     ' ---> Patterns
  135.     FOR i=0 TO maxpat-1
  136.       PRINT AT(5,16);"...only ";maxpat-i;" patterns to go..."
  137.       FOR z=0 TO 63
  138.         FOR s=0 TO 3
  139.           adr=s_offs+272+512*i+8*z+2*s
  140.           s_note=PEEK(adr)
  141.           voice=PEEK(adr+1)
  142.           IF s_note>0
  143.             octave=s_note DIV 16
  144.             dnote=s_note MOD 16
  145.             pos=12*(octave-1)+dnote
  146.             adr=d_offs+600+1024*i+16*z+4*s
  147.             DPOKE adr,t%(pos)
  148.             POKE adr+2,voice
  149.           ENDIF
  150.         NEXT s
  151.       NEXT z
  152.     NEXT i
  153.     l=600+1024*maxpat
  154.     FILESELECT "\*.ami","",n$
  155.     IF n$<>""
  156.       BSAVE n$,d_offs,l
  157.     ENDIF
  158.   ENDIF
  159. RETURN
  160. '
  161. PROCEDURE tab_init
  162.   t=&H358
  163.   q=2^(1/12)
  164.   FOR i=0 TO 35
  165.     t%(i)=t
  166.     t=t/q
  167.   NEXT i
  168. RETURN
  169.